The Effect of Dynamic Date Injection Methods on LLM Temporal Reasoning across Deictic Expression Granularities
TL;DR
LLM은 "어제", "다음 주"와 같은 상대적 시간 표현을 해석할 때 현재 날짜를 알 수 없어 날짜 주입이 필수입니다. 320회의 실험 결과, 한국어 형식(
2025년 3월 19일) + User Prompt 조합이 Simple/Structured 모두에서 95% 정확도를 달성했으며, 날짜 미주입 시 15%에 불과했던 성능이 최대 95%까지 향상되었습니다. 특히 Week granularity(다음 주 월요일 등)는 요일 정보 포함 시 40%→80% 개선되며, gpt-4o 사용 시 모든 시간 단위에서 100% 정확도를 보였습니다.
Key Takeaways
- 날짜 주입은 선택이 아닌 필수: 날짜 정보 없이는 Day/Week/Month granularity에서 0% 정확도를 기록하며, Year 단위 상식 문제만 60% 수준으로 부분 정답 가능
- 한국어 질의에는 한국어 날짜 형식 사용:
현재 날짜: 2025년 3월 19일형식이 Structured Output에서 English 대비 +15%p 우위(95% vs 80%)를 보이며 응답 방식에 관계없이 안정적 - User Prompt가 System Prompt보다 효과적: 질의와 가까운 위치에 날짜를 배치하면 Simple Response에서 +3.3%p 성능 향상(95.0% vs 91.7%)
- Week granularity가 가장 어렵다: "다음 주 월요일" 같은 표현은 현재 요일 인식→주 경계 판단→날짜 계산의 3단계 추론이 필요하며, 한국어 요일 정보 추가 시 40%→80% 개선
- 과도한 정보는 오히려 역효과: 주말 설명 등 불필요한 부가 정보는 LLM의 추론을 방해하여 5~10%p 성능 하락 유발
상세 내용
배경: 왜 날짜 프롬프트가 필요한가
LLM은 학습 데이터의 시점에 고정되어 있어 "지금이 언제인지" 스스로 알 수 없습니다. 따라서 "어제", "지난주", "다음 달"과 같은 **직시 표현(Deictic Expression)**을 해석할 때 현재 날짜를 기준점으로 제공해야 정확한 날짜 변환이 가능합니다.
600회의 추론 실험(gpt-4o-mini 기준)에서 날짜 주입 유무에 따른 성능 차이는 다음과 같습니다:
| 조건 | Accuracy | Day | Week | Month | Year |
|---|---|---|---|---|---|
| 날짜 주입 없음 | 15% | 0% | 0% | 0% | 60% |
| 날짜 주입 있음 | 95% | 100% | 100% | 100% | 80% |
날짜 주입 없이는 "작년 크리스마스"와 같은 Year granularity 상식 문제만 부분 정답(60%)이 가능하며, 실시간 계산이 필요한 Day/Week/Month는 전부 0%로 시간 추론 자체가 불가능합니다.
문제 상황: 4가지 설계 변수의 영향
날짜 프롬프트 설계 시 고려해야 할 4가지 변수와 각각의 성능 영향을 실험으로 검증했습니다.
1. Prompt Position: 어디에 넣을 것인가
| Position | Simple ACC | Structured ACC |
|---|---|---|
| System Prompt | 91.7% | 85.0% |
| User Prompt | 95.0% | 85.0% |
User Prompt에 날짜 정보를 배치하면 질의와 가까운 위치에서 참조 효율이 높아져 Simple Response에서 +3.3%p 우위를 보였으며, Structured Output에서는 동일하므로 선택에 따른 손해가 없습니다.
2. Expression Format: 어떤 형식으로 넣을 것인가
테스트한 3가지 형식의 성능 비교:
| Format | 예시 | Simple | Structured | 평균 |
|---|---|---|---|---|
| Korean | 현재 날짜: 2025년 3월 19일 | 92.5% | 95.0% | 93.8% |
| English | Current date: March 19th, 2025 | 95.0% | 80.0% | 87.5% |
| DayOfWeek | Current date: 2025-03-19, Wed | 92.5% | 80.0% | 86.3% |
Korean 형식이 가장 안정적입니다. Simple Response에서는 3개 format 간 차이가 미미(92.5~95.0%)하지만, Structured Output에서 Korean(95%)이 English/DayOfWeek(80%)를 크게 압도합니다. 이는 한국어 질의에 한국어 날짜 표현을 사용할 때 토큰 정렬이 자연스럽게 이루어지기 때문으로 추정됩니다.
3. 날짜 컨텍스트 상세도: 얼마나 많은 정보를 넣을 것인가
| 컨텍스트 | 내용 | ACC |
|---|---|---|
| A | 날짜 + 시간 (현재 날짜: 2025-03-19 (수요일) / 현재 시간: 14:00) | 85~90% |
| B | 날짜 + 주간 달력 (이번 주/지난 주 전체 날짜 나열) | 85~90% |
| C | 날짜만 (현재 날짜: 2025-03-19 (Wed)) | 80% |
날짜만 제공하고 영문 요일만 포함한 경우(C) Week granularity에서 40%까지 하락했습니다. A/B처럼 한국어 요일을 포함하면 Week에서 80%를 유지할 수 있으며, 주간 달력(B)은 정보량 대비 성능 향상이 미미했습니다. 과도한 정보(주말 설명 등)를 추가하면 오히려 5~10%p 하락하므로 주의가 필요합니다.
4. Output 방식: 응답을 어떤 형식으로 받을 것인가
| Output | ACC | Week ACC |
|---|---|---|
| Simple (텍스트) | 95% | 100% |
| Structured (instructor) | 85% | 60% |
시간 추론에서는 Simple Response가 유리합니다. 전체 정확도에서 +10%p 차이가 있으며, 핵심은 Week granularity(60% → 100%)입니다. Structured Output의 schema 강제가 추론 chain을 방해하는 것으로 분석되며, Structured가 필요한 경우 Korean format + User Prompt 조합으로 95%까지 보완 가능합니다.
해결 과정: Granularity별 난이도 분석
LLM의 시간 추론 능력은 시간 단위에 따라 극적으로 달라집니다:
| 순위 | Granularity | ACC 범위 | 핵심 특성 | 오류 패턴 |
|---|---|---|---|---|
| 1 (쉬움) | Day | 100% | 단순 ±N일 산술 | 오류 없음 |
| 2 | Month | 80~100% | 월말/월초 계산 | 요일 역산에서 간헐적 오류 |
| 3 | Year | 60~100% | 상식 + 요일 계산 | 먼 미래 요일 추론 실패 |
| 4 (어려움) | Week | 40~100% | 요일 기반 상대 계산 | "다음 주 월요일" 등에서 ±1주 오류 빈번 |
Week Granularity가 가장 어려운 이유는 "다음 주 월요일" 같은 표현 해석 시 현재 요일 인식 → 주 경계 판단 → 날짜 계산의 3단계 추론이 필요하기 때문입니다. LLM이 "다음 주"의 경계를 잘못 판단하여 ±1주 오프셋 오류가 빈번하게 발생하며, Structured Output에서는 schema 제약이 이 추론 과정을 더욱 방해합니다.
주간 달력을 프롬프트에 포함하거나 상위 모델을 사용하면 개선 가능합니다:
| 모델 | Day | Week | Month | Year | Overall |
|---|---|---|---|---|---|
| gpt-4o-mini | 100% | 60% | 100% | 80% | 85% |
| gpt-4o | 100% | 100% | 100% | 100% | 100% |
gpt-4o는 모든 granularity에서 100% 정확도를 달성하여 모델 크기가 시간 추론에 직접적 영향을 미치는 것을 확인했습니다.
결과: 권장 프롬프트 템플릿
실험 결과를 바탕으로 Best Practice: Korean + User Prompt 조합을 권장합니다:
# 기본 템플릿 (Simple: 95% / Structured: 95%)
system_prompt = """
사용자의 질문에 정확하게 답변하세요.
"""
user_prompt_template = """
현재 날짜: {year}년 {month}월 {day}일
사용자가 '오늘', '어제', '그저께', '금주', '지난주', '이번 달', '주말' 등
상대적 날짜 표현을 사용하면 위 현재 날짜를 기준으로 구체적인 날짜(YYYY-MM-DD)로 변환하세요.
{user_query}
"""
# 사용 예시
from datetime import datetime
now = datetime.now()
user_query = "지난주 금요일에 작성된 보고서를 찾아줘"
user_prompt = user_prompt_template.format(
year=now.year,
month=now.month,
day=now.day,
user_query=user_query
)
Week 정확도가 중요한 경우 주간 달력 추가:
# Week granularity 강화 템플릿 (Week: 80% → 100% for gpt-4o)
from datetime import datetime, timedelta
def get_week_calendar(reference_date):
# 이번 주 월요일 찾기
this_monday = reference_date - timedelta(days=reference_date.weekday())
# 지난 주 월요일
last_monday = this_monday - timedelta(days=7)
days_kr = ['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']
this_week = []
last_week = []
for i in range(7):
this_day = this_monday + timedelta(days=i)
last_day = last_monday + timedelta(days=i)
this_week.append(f"{days_kr[i]}({this_day.strftime('%Y-%m-%d')})")
last_week.append(f"{days_kr[i]}({last_day.strftime('%Y-%m-%d')})")
return this_week, last_week
now = datetime.now()
this_week, last_week = get_week_calendar(now)
user_prompt_with_calendar = f"""
현재 날짜: {now.year}년 {now.month}월 {now.day}일 ({['월요일','화요일','수요일','목요일','금요일','토요일','일요일'][now.weekday()]})
- 이번 주: {', '.join(this_week)}
- 지난 주: {', '.join(last_week)}
사용자가 '오늘', '어제', '그저께', '금주', '지난주', '이번 달', '주말' 등
상대적 날짜 표현을 사용하면 위 현재 날짜를 기준으로 구체적인 날짜(YYYY-MM-DD)로 변환하세요.
{user_query}
"""
피해야 할 안티패턴:
# ❌ 안티패턴 1: 날짜 정보 미주입
user_prompt_bad1 = """
사용자의 상대적 날짜 표현을 절대 날짜로 변환하세요.
{user_query}
"""
# → Day/Week/Month 0%, 전체 15%
# ❌ 안티패턴 2: 영문 날짜 + Structured Output
user_prompt_bad2 = """
Current date: March 19th, 2025
Convert relative date expressions to absolute dates.
{user_query}
"""
# + Structured Output → 80% (Week 40~60%)
# ❌ 안티패턴 3: 과도한 부가 설명
user_prompt_bad3 = """
현재 날짜: 2025년 3월 19일
주말은 토요일과 일요일을 의미합니다.
월말은 매월 마지막 날을 의미합니다.
...
{user_query}
"""
# → -5~10%p 하락
# ❌ 안티패턴 4: 날짜만 (요일 없이)
user_prompt_bad4 = """
Current date: 2025-03-19
{user_query}
"""
# → Week 40%
의사결정 가이드
프로젝트 상황에 따른 날짜 프롬프트 설계 의사결정 플로우:
1. 날짜 주입이 있는가?
└─ NO → 반드시 추가 (없으면 15%)
└─ YES → 다음 단계
2. 질의가 한국어인가?
└─ YES → Korean format 사용 ("2025년 3월 19일")
└─ NO → English format 사용 ("March 19th, 2025")
3. Structured Output이 필요한가?
└─ NO → Simple 사용 (최고 성능)
└─ YES → 반드시 Korean format + User Prompt 조합 (95% 보장)
4. Week 추론 정확도가 critical한가?
└─ NO → 기본 템플릿으로 충분
└─ YES → 주간 달력 추가 또는 gpt-4o 사용 고려
5. 전체 정확도 100%가 필요한가?
└─ NO → gpt-4o-mini + 최적 프롬프트 (95%)
└─ YES → gpt-4o 사용 (100%)
종합 권장 설정
| 항목 | 권장값 | 대안 | 근거 |
|---|---|---|---|
| Time Injection | 필수 | - | 미주입 시 15% |
| Expression Format | Korean | English (Simple 한정) | Structured에서 +15%p 차이 |
| Prompt Position | User Prompt | System Prompt (동등) | Simple에서 +3.3%p |
| Output 방식 | Simple | Structured (Korean+User 시 95%) | 전체 +10%p, Week +40%p |
| 날짜 컨텍스트 | 날짜 + 한국어 요일 | 주간 달력 (Week 중요 시) | Week ACC 40→80% |
| 부가 설명 | 불필요 | - | 추가 시 오히려 하락 |
| 모델 | gpt-4o (정확도 우선) | gpt-4o-mini (비용 우선) | 100% vs 85~95% |
실험 환경 및 데이터
실험 구성:
- Target LLM:
gpt-4o-mini(baseline),gpt-4o(비교) - Temperature:
0.0 - 기준 날짜: 2025-03-19 (Wednesday)
- 테스트 쿼리: 20개 (Day 5 + Week 5 + Month 5 + Year 5)
- 평가 메트릭: Accuracy — Include Match (정답 날짜가 응답에 포함되는지 판단)
- 총 추론 수: 600개 (Baseline 320 + Expression Format 280)
상세 실험 데이터:
BASELINE_RESULTS.md: 날짜 컨텍스트 3종, seed/temp/output/model 비교 (320개 레코드)EXPERIMENT_RESULTS.md: Expression Format × Injection Position 7-case (280개 레코드)
References
- Date Fragments: A Hidden Bottleneck of Tokenization for Temporal Reasoning - BPE 토크나이저의 날짜 분할 문제와 LLM의 날짜 추상화 메커니즘 분석 (arXiv 2505.16088, 2025)
- Automatic Integration of Temporal Context for LLM - LLM을 위한 시간 컨텍스트 자동 통합 방법론 (Defensive Publication, 2025)
- Can Prompts Rewind Time for LLMs? - 프롬프트를 통한 LLM의 시간 인식 개선 연구 (Gao et al., EMNLP 2025)
- Deictic Temporal Expression Granularity 실험 Repository - 본 연구의 전체 실험 코드 및 데이터셋

